#ifndef __OLED_SSD1315_CONFIG_H
#define __OLED_SSD1315_CONFIG_H

#include "stm32f10x.h"
#include "stdbool.h"
#include <stdio.h>
#include "IIC_Simulate_Config.h"

/*
 *	写入从设备地址（OLED_SSD1315_SLAVE_ADDRESS）
 *	0x78 是7位从设备地址（0x3C）左移1位后的值（因为I²C地址是7位，最低位表示读写方向：0为写，1为读）
 *	计算：0x3C << 1 = 0x78（写模式）,R/W#=0
 */
#define	OLED_SSD1315_SLAVE_ADDRESS	0x3C

/*
 *	写入控制字节，通常用于区分命令和数据
 *	0x00 表示后续发送的是命令（而非数据）
 */
#define WRITE_COMMAND				0x00

/*
 *	写入控制字节，通常用于区分命令和数据
 *	0x40 表示后续发送的是数据（而非命令）
 */
#define WRITE_DATA					0x40

#define OLED_WIDTH                 128    // 屏幕列数
#define OLED_HEIGHT                64     // 屏幕行数
#define OLED_PAGE_NUM              8      // 显存页数(每页8行)

/* 模式选择 */
#define OLED_CMD     0  // 命令模式
#define OLED_DATA    1  // 数据模式

/* 基础通信函数 */
void OLED_SSD1315_Start(void);       // I2C起始信号
void OLED_SSD1315_Stop(void);        // I2C停止信号
bool OLED_SSD1315_Wait_ACK(void);    // 等待应答

/* 数据/命令传输 */
bool OLED_SSD1315_Write_Command(u8 cmd);  // 写入命令
bool OLED_SSD1315_Write_Data(u8 data);    // 写入数据
void OLED_SSD1315_Dat_or_Cmd(u8 val, u8 mode); // 通用写入

/* 屏幕控制 */
void OLED_SSD1315_Display_On(void);   // 开启显示
void OLED_SSD1315_Display_Off(void);  // 关闭显示
void OLED_SSD1315_Clear(void);        // 清屏(全黑)
void OLED_SSD1315_ON(void);           // 全屏点亮(测试用)

/* 显示控制 */
void OLED_SSD1315_Set_Pos(u8 x, u8 y);  // 设置显示位置
bool OLED_SSD1315_FillScreen(u8 pattern); // 填充屏幕

/* 内容显示 */
void OLED_SSD1315_ShowChar(u8 x, u8 y, u8 chr, u8 size);  // 显示字符
void OLED_SSD1315_ShowString(u8 x, u8 y, const char* str, u8 size, bool wrap); // 显示字符串
void OLED_SSD1315_ShowNum(u8 x, u8 y, uint32_t num, u8 len, u8 size); // 显示数字
void OLED_SSD1315_ShowChinese(u8 x, u8 y, u8 index);      // 显示汉字
bool OLED_SSD1315_DrawBitmap(u8 x0, u8 y0, u8 x1, u8 y1, const u8 *bmp); // 显示位图

/* 辅助功能 */
uint32_t OLED_Math_Pow(u8 base, u8 exponent);  // 快速幂计算

/* 初始化函数 */
void OLED_SSD1315_Init(void);  // OLED初始化

#endif
